package site.wlwsjsx.iot_backend.mapper;

import org.apache.ibatis.annotations.Param;
import site.wlwsjsx.iot_backend.entity.DeviceEvent;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 设备事件 Mapper 接口
 * 对应表：device_event
 */
public interface DeviceEventMapper {

    /**
     * 新增设备事件
     *
     * @param deviceEvent 设备事件对象
     * @return 受影响行数（成功为1）
     */
    int insert(DeviceEvent deviceEvent);

    /**
     * 根据设备ID查询最新的设备事件
     *
     * @param deviceId 设备ID
     * @return 最新设备事件，无数据返回null
     */
    DeviceEvent selectLatestByDeviceId(@Param("deviceId") String deviceId);

    /**
     * 根据设备ID和事件标识符查询设备事件
     *
     * @param deviceId        设备ID
     * @param eventIdentifier 事件标识符
     * @return 设备事件列表
     */
    List<DeviceEvent> selectByDeviceIdAndIdentifier(
            @Param("deviceId") String deviceId,
            @Param("eventIdentifier") String eventIdentifier
    );

    /**
     * 根据事件类型查询设备事件
     *
     * @param eventType 事件类型
     * @return 设备事件列表
     */
    List<DeviceEvent> selectByEventType(@Param("eventType") String eventType);

    /**
     * 根据产品ID查询设备事件
     *
     * @param productId 产品ID
     * @return 设备事件列表
     */
    List<DeviceEvent> selectByProductId(@Param("productId") String productId);

    /**
     * 根据时间范围查询设备事件
     *
     * @param startTime 开始时间
     * @param endTime   结束时间
     * @return 设备事件列表
     */
    List<DeviceEvent> selectByTimeRange(
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime
    );

    /**
     * 分页查询设备事件
     *
     * @param offset   分页偏移量
     * @param pageSize 每页条数
     * @return 设备事件列表
     */
    List<DeviceEvent> selectByPage(
            @Param("offset") int offset,
            @Param("pageSize") int pageSize
    );

    /**
     * 查询设备事件总数
     *
     * @return 总记录数
     */
    Long countAll();

    /**
     * 根据条件查询设备事件总数
     *
     * @param deviceId        设备ID（可为null）
     * @param eventIdentifier 事件标识符（可为null）
     * @param eventType       事件类型（可为null）
     * @param productId       产品ID（可为null）
     * @param startTime       开始时间（可为null）
     * @param endTime         结束时间（可为null）
     * @return 总记录数
     */
    Long countByCondition(
            @Param("deviceId") String deviceId,
            @Param("eventIdentifier") String eventIdentifier,
            @Param("eventType") String eventType,
            @Param("productId") String productId,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime
    );

    /**
     * 根据条件分页查询设备事件
     *
     * @param deviceId        设备ID（可为null）
     * @param eventIdentifier 事件标识符（可为null）
     * @param eventType       事件类型（可为null）
     * @param productId       产品ID（可为null）
     * @param startTime       开始时间（可为null）
     * @param endTime         结束时间（可为null）
     * @param offset          分页偏移量
     * @param pageSize        每页条数
     * @return 设备事件列表
     */
    List<DeviceEvent> selectByCondition(
            @Param("deviceId") String deviceId,
            @Param("eventIdentifier") String eventIdentifier,
            @Param("eventType") String eventType,
            @Param("productId") String productId,
            @Param("startTime") LocalDateTime startTime,
            @Param("endTime") LocalDateTime endTime,
            @Param("offset") int offset,
            @Param("pageSize") int pageSize
    );

    /**
     * 更新设备事件处理状态
     *
     * @param id        设备事件ID
     * @param processed 处理状态
     * @return 受影响行数
     */
    int updateProcessedStatus(@Param("id") Long id, @Param("processed") Boolean processed);

    /**
     * 批量更新设备事件处理状态
     *
     * @param ids       设备事件ID列表
     * @param processed 处理状态
     * @return 受影响行数
     */
    int batchUpdateProcessedStatus(@Param("ids") List<Long> ids, @Param("processed") Boolean processed);

    /**
     * 根据ID删除设备事件
     *
     * @param id 设备事件ID
     * @return 受影响行数
     */
    int deleteById(@Param("id") Long id);

    /**
     * 根据时间范围删除过期设备事件
     *
     * @param beforeTime 删除此时间之前的记录
     * @return 受影响行数
     */
    int deleteByTimeBefore(@Param("beforeTime") LocalDateTime beforeTime);

    /**
     * 根据设备ID统计事件数量
     *
     * @param deviceId 设备ID
     * @return 事件数量
     */
    Long countByDeviceId(@Param("deviceId") String deviceId);

    /**
     * 根据产品ID统计事件数量
     *
     * @param productId 产品ID
     * @return 事件数量
     */
    Long countByProductId(@Param("productId") String productId);
}
